package com.hemaapp.yjnh.push;

import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;

import com.baidu.android.pushservice.PushMessageReceiver;
import com.hemaapp.yjnh.activity.BuyerOrderDetailActivity;
import com.hemaapp.yjnh.activity.BuyerCustomOrderDetailActivity;
import com.hemaapp.yjnh.activity.FarmerOrderDetailActivity;
import com.hemaapp.yjnh.activity.FriendPayDetailActivity;
import com.hemaapp.yjnh.activity.LaokeDetailActivity;
import com.hemaapp.yjnh.activity.MainActivity;
import com.hemaapp.yjnh.activity.MyFarmerActivity;
import com.hemaapp.yjnh.activity.NoticeListActivity;
import com.hemaapp.yjnh.bean.EventBusConfig;
import com.hemaapp.yjnh.bean.EventBusMsg;
import com.hemaapp.yjnh.bean.User;
import com.hemaapp.yjnh.BaseApplication;
import com.hemaapp.yjnh.R;

import de.greenrobot.event.EventBus;

/**
 * Push消息处理receiver。请编写您需要的回调函数， 一般来说： onBind是必须的，用来处理startWork返回值；
 * onMessage用来接收透传消息； onSetTags、onDelTags、onListTags是tag相关操作的回调；
 * onNotificationClicked在通知被点击时回调； onUnbind是stopWork接口的返回值回调
 * 
 * 返回值中的errorCode，解释如下： 0 - Success 10001 - Network Problem 30600 - Internal
 * Server Error 30601 - Method Not Allowed 30602 - Request Params Not Valid
 * 30603 - Authentication Failed 30604 - Quota Use Up Payment Required 30605 -
 * Data Required Not Found 30606 - Request Time Expires Timeout 30607 - Channel
 * Token Timeout 30608 - Bind Relation Not Found 30609 - Bind Number Too Many
 * 
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。
 * 
 */
public class MyPushMessageReceiver extends PushMessageReceiver {
	/** TAG to Log */
	public static final String TAG = MyPushMessageReceiver.class
			.getSimpleName();

	private NotificationManager notificationManager = null;

	/**
	 * 调用PushManager.startWork后，sdk将对push
	 * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
	 * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
	 * 
	 * @param context
	 *            BroadcastReceiver的执行Context
	 * @param errorCode
	 *            绑定接口返回值，0 - 成功
	 * @param appid
	 *            应用id。errorCode非0时为null
	 * @param userId
	 *            应用user id。errorCode非0时为null
	 * @param channelId
	 *            应用channel id。errorCode非0时为null
	 * @param requestId
	 *            向服务端发起的请求id。在追查问题时有用；
	 * @return none
	 */
	@Override
	public void onBind(Context context, int errorCode, String appid,
			String userId, String channelId, String requestId) {
		String responseString = "onBind errorCode=" + errorCode + " appid="
				+ appid + " userId=" + userId + " channelId=" + channelId
				+ " requestId=" + requestId;

		// 绑定成功，设置已绑定flag，可以有效的减少不必要的绑定请求
		if (errorCode == 0) {
			PushUtils.setBind(context, true);
		}
        PushUtils.saveUserId(context, userId);
        PushUtils.saveChannelId(context, channelId);
		EventBusMsg msg = new EventBusMsg();
		msg.setType(EventBusConfig.PUSH_CID);
		EventBus.getDefault().post(msg);
	}

	/**
	 * 接收透传消息的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param message
	 *            推送的消息
	 * @param customContentString
	 *            自定义内容,为空或者json字符串
	 */
	@Override
	public void onMessage(Context context, String message,
			String customContentString) {
		if (notificationManager == null)
			notificationManager = (NotificationManager) context
					.getSystemService(Context.NOTIFICATION_SERVICE);
		String msg_title = "";
        String msg_description = "";
        String msg_keytype = "";
        String msg_keyid="";
		try {
			JSONObject msgJson = new JSONObject(message);
			msg_title = msgJson.getString("title");
			msg_description = msgJson.getString("description");
			JSONObject customJson = msgJson.getJSONObject("custom_content");
			msg_keytype = customJson.getString("keyType");
            msg_keyid = customJson.getString("keyID");
		} catch (JSONException e) {
			e.printStackTrace();
			return;
		}

		if (msg_title == null || TextUtils.isEmpty(msg_title))
			msg_title = "易家农户";

		if (msg_keytype.equals("11")) {//用户被冻结
            EventBusMsg msg = new EventBusMsg();
            msg.setType(EventBusConfig.CLIENT_FREEZE);
            EventBus.getDefault().post(msg);
		}else {
			mynotify(context, msg_description, msg_title, msg_keytype, msg_keyid);
            PushUtils.savemsgreadflag(context, true, msg_keytype);
            EventBusMsg msg = new EventBusMsg();
            msg.setType(EventBusConfig.NEW_MSG);
            EventBus.getDefault().post(msg);
		}
	}

	/**
	 * 接收通知点击的函数。注：推送通知被用户点击前，应用无法通过接口获取通知的内容。
	 * 
	 * @param context
	 *            上下文
	 * @param title
	 *            推送的通知的标题
	 * @param description
	 *            推送的通知的描述
	 * @param customContentString
	 *            自定义内容，为空或者json字符串
	 */
	@Override
	public void onNotificationClicked(Context context, String title,
			String description, String customContentString) {
		String notifyString = "通知点击 title=\"" + title + "\" description=\""
				+ description + "\" customContent=" + customContentString;
		Log.d(TAG, notifyString);

		// 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
		if (!TextUtils.isEmpty(customContentString)) {
			JSONObject customJson = null;
			try {
				customJson = new JSONObject(customContentString);
				String myvalue = null;
				if (customJson.isNull("mykey")) {
					myvalue = customJson.getString("mykey");
				}
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		// updateContent(context, notifyString);

	}

	/**
	 * 接收通知到达的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param title
	 *            推送的通知的标题
	 * @param description
	 *            推送的通知的描述
	 * @param customContentString
	 *            自定义内容，为空或者json字符串
	 */

	@Override
	public void onNotificationArrived(Context context, String title,
			String description, String customContentString) {

		String notifyString = "onNotificationArrived  title=\"" + title
				+ "\" description=\"" + description + "\" customContent="
				+ customContentString;
		Log.d(TAG, notifyString);

		// 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
		if (!TextUtils.isEmpty(customContentString)) {
			JSONObject customJson = null;
			try {
				customJson = new JSONObject(customContentString);
				String myvalue = null;
				if (!customJson.isNull("mykey")) {
					myvalue = customJson.getString("mykey");
				}
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * setTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
	 * @param failTags
	 *            设置失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onSetTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onSetTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
		Log.d(TAG, responseString);

	}

	/**
	 * delTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
	 * @param failTags
	 *            删除失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onDelTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onDelTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
	}

	/**
	 * listTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示列举tag成功；非0表示失败。
	 * @param tags
	 *            当前应用设置的所有tag。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onListTags(Context context, int errorCode, List<String> tags,
			String requestId) {
		String responseString = "onListTags errorCode=" + errorCode + " tags="
				+ tags;
	}

	/**
	 * PushManager.stopWork() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示从云推送解绑定成功；非0表示失败。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onUnbind(Context context, int errorCode, String requestId) {
		String responseString = "onUnbind errorCode=" + errorCode
				+ " requestId = " + requestId;
		Log.d(TAG, responseString);

		// 解绑定成功，设置未绑定flag，
		if (errorCode == 0) {
			PushUtils.setBind(context, false);
		}
	}

	public void mynotify(Context context, String content, String title,
			String keytype, String keyid) {
		Log.d(TAG, "notify()...");

		Log.d(TAG, "content=" + content);

		// Notification
		Notification notification = new Notification();
		notification.icon = R.drawable.ic_launcher;
		notification.defaults = Notification.DEFAULT_LIGHTS;

		notification.defaults |= Notification.DEFAULT_SOUND;

		notification.flags |= Notification.FLAG_AUTO_CANCEL;
		notification.when = System.currentTimeMillis();
		notification.tickerText = content;
		Intent intent;
		//keytype:
		//	0：真聊天消息
		//	1：系统通知 
		//2：帖子回复（帖子代指项目核心业务模型） 
		//3：简单聊天（假聊天） 
		//5：申请好友 
		//6：卖家普通订单通知 
		//7：代付订单通知 
		//8：买家普通订单通知 
		//9：买家定制订单通知； 
		//10：卖家定制订单通知；
		//11：冻结用户通知 
		if ("1".equals(keytype)) {
			intent = new Intent(context, NoticeListActivity.class);
			intent.putExtra("start", 2);
		}else if ("2".equals(keytype)) {
			intent = new Intent(context, LaokeDetailActivity.class);
			intent.putExtra("blog_id", keyid);
		}else if ("0".equals(keytype)) {//跳转到聊天界面
//			intent = new Intent(context, ChatPrivateActivity.class);
//			intent.putExtra("to_client_id", keyid);
			intent = new Intent(context, NoticeListActivity.class);
		}else if ("6".equals(keytype)) {//跳转SellerOrderDtlActivity卖家订单详情
			intent = new Intent(context, FarmerOrderDetailActivity.class);
			intent.putExtra("order_id", keyid);
		}else if ("7".equals(keytype)) {//跳转FriendPayDtlActivity申请方和被申请方的代付
			intent = new Intent(context, FriendPayDetailActivity.class);
			intent.putExtra("order_id", keyid);
		}else if ("8".equals(keytype)) {//跳转BuyerOrderDtlActivity买家订单详情
			intent = new Intent(context, BuyerOrderDetailActivity.class);
			intent.putExtra("order_id", keyid);
		}else if ("9".equals(keytype)) {//9：买家定制订单通知
			intent = new Intent(context, BuyerCustomOrderDetailActivity.class);
			intent.putExtra("order_id", keyid);
		}else if ("10".equals(keytype)) {//卖家定制订单通知,
			User user = BaseApplication.getInstance().getUser();
			if (user != null && user.getRole().equals("1")) {//如果是田家
				intent = new Intent(context, MyFarmerActivity.class);
				intent.putExtra("start_page", 2);
			}else {
				return;
			}
		}else {
			intent = new Intent(context, MainActivity.class);
		}
		intent.putExtra("msgshow", true);

		if (content.startsWith("广播")) {
			intent.putExtra("broadcast", true);
		} else {
			intent.putExtra("broadcast", false);
		}

		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
		intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
		intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
		intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

		PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
				intent, PendingIntent.FLAG_UPDATE_CURRENT);

//		notification.setLatestEventInfo(context, title, content, contentIntent);
		Notification.Builder builder = new Notification.Builder(context);
		builder.setContentIntent(contentIntent)
				.setSmallIcon(R.drawable.ic_launcher)
				.setDefaults(Notification.DEFAULT_ALL)
				.setWhen(System.currentTimeMillis()).setAutoCancel(true)
				.setContentTitle(title).setContentText(content);
		notificationManager.notify(0, builder.getNotification());
	}
	
}
